
/* Copyright (c) Mark J. Kilgard, 1997, 2001. */

/* This program is freely distributable without licensing fees
   and is provided without guarantee or warrantee expressed or
   implied. This program is -not- in the public domain. */

#include <stdlib.h>
#include <string.h>
#include "glutint.h"

int
__glutIsSupportedByWGL(const char *extension)
{
  if (wglGetExtensionsStringARB) {
    static const GLubyte *extensions = NULL;
    const GLubyte *start;
    GLubyte *where, *terminator;
  
    /* Extension names should not have spaces. */
    where = (GLubyte *) strchr(extension, ' ');
    if (where || *extension == '\0') {
      return 0;
    }
  
    if (!extensions) {
      extensions = (const GLubyte *) wglGetExtensionsStringARB(GetDC(0));
    }

    if (extensions) {
      /* It takes a bit of care to be fool-proof about parsing the
         OpenGL extensions string.  Don't be fooled by sub-strings,
         etc. */
      start = extensions;
      for (;;) {
        /* If your application crashes in the strstr routine below,
           you are probably calling glutExtensionSupported without
           having a current window.  Calling glGetString without
           a current OpenGL context has unpredictable results.
           Please fix your program. */
        where = (GLubyte *) strstr((const char *) start, extension);
        if (!where) {
          break;
        }
        terminator = where + strlen(extension);
        if (where == start || *(where - 1) == ' ') {
          if (*terminator == ' ' || *terminator == '\0') {
            return 1;
          }
        }
        start = terminator;
      }
    }
  }

  return 0;
}

